/*
 *              Copyright (C) 2011 The MusicMod Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *            http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.musicmod.android.receiver;

import org.musicmod.android.Constants;
import org.musicmod.android.MusicPlaybackService;
import org.musicmod.android.activity.MusicBrowserActivity;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;

public class MediaButtonIntentReceiver extends BroadcastReceiver implements
		Constants {

	private static final int MSG_LONGPRESS_TIMEOUT = 1;
	private static final int LONG_PRESS_DELAY = 1000;

	private static long mLastClickTime = 0;
	private static long mLastDoubleClickTime = 0;
	private static boolean mDown = false;
	private static boolean mLaunched = false;

	private static Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MSG_LONGPRESS_TIMEOUT:
				if (!mLaunched) {
					Context context = (Context) msg.obj;
					Intent i = new Intent();
					i.putExtra("autoshuffle", "true");
					i.setClass(context, MusicBrowserActivity.class);
					i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
							| Intent.FLAG_ACTIVITY_CLEAR_TOP);
					context.startActivity(i);
					mLaunched = true;
				}
				break;
			}
		}
	};

	@Override
	public void onReceive(Context context, Intent intent) {
		String intentAction = intent.getAction();
		if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intentAction)) {
			Intent i = new Intent(SERVICECMD);
			i.putExtra(CMDNAME, CMDPAUSE);
			context.sendBroadcast(i);
		} else if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
			KeyEvent event = (KeyEvent) intent
					.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

			if (event == null) {
				return;
			}

			int keycode = event.getKeyCode();
			int action = event.getAction();
			long eventtime = event.getEventTime();

			// single quick press: pause/resume.
			// double press: next track
			// long press: start auto-shuffle mode.

			String command = null;
			switch (keycode) {
			case KeyEvent.KEYCODE_MEDIA_STOP:
				command = CMDSTOP;
				break;
			case KeyEvent.KEYCODE_HEADSETHOOK:
			case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
				command = CMDTOGGLEPAUSE;
				break;
			case KeyEvent.KEYCODE_MEDIA_NEXT:
				command = CMDNEXT;
				break;
			case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
				command = CMDPREVIOUS;
				break;
			}

			if (command != null) {
				if (action == KeyEvent.ACTION_DOWN) {
					if (mDown) {
						if (CMDTOGGLEPAUSE.equals(command)
								&& mLastClickTime != 0
								&& eventtime - mLastClickTime > LONG_PRESS_DELAY) {
							mHandler.sendMessage(mHandler.obtainMessage(
									MSG_LONGPRESS_TIMEOUT, context));
						}
					} else {
						// if this isn't a repeat event

						// The service may or may not be running, but we need to
						// send it
						// a command.
						Intent i = new Intent(context,
								MusicPlaybackService.class);
						i.setAction(SERVICECMD);
						if (keycode == KeyEvent.KEYCODE_HEADSETHOOK
								&& eventtime - mLastDoubleClickTime < 300) {
							i.putExtra(CMDNAME, CMDPREVIOUS);

							// Play previous song when headset button is clicked
							// thrice.
							// The command needs to be sent twice since a double
							// click
							// would have sent CMDNEXT so to move to the
							// previous song,
							// we need to send CMDPREVIOUS twice now
							context.startService(i);
							context.startService(i);
							mLastClickTime = 0;
							mLastDoubleClickTime = 0;
						} else if (keycode == KeyEvent.KEYCODE_HEADSETHOOK
								&& eventtime - mLastClickTime < 300) {
							i.putExtra(CMDNAME, CMDNEXT);
							context.startService(i);
							mLastClickTime = 0;
							mLastDoubleClickTime = eventtime;
						} else {
							i.putExtra(CMDNAME, command);
							context.startService(i);
							mLastClickTime = eventtime;
						}

						mLaunched = false;
						mDown = true;
					}
				} else {
					mHandler.removeMessages(MSG_LONGPRESS_TIMEOUT);
					mDown = false;
				}
				if (isOrderedBroadcast()) {
					abortBroadcast();
				}
			}
		}
	}
}
